package com.ywyself.dao;

import java.util.Date;

import com.jfinal.kit.Kv;
import com.jfinal.kit.LogKit;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Page;
import com.jfinal.plugin.activerecord.Record;
import com.jfinal.plugin.activerecord.SqlPara;
import com.ywyself.ext.kit.YsKit;
import com.ywyself.ext.utils.YsDateUtils;
import com.ywyself.model.Catelog;

public class CatelogDao {
    /**
     * 表名
     */
    private static final String TABLE_NAME = "ys_catelog";

    /**
     * 新增一个分类
     * 
     * @param catelog
     *            分类信息模型
     * @return true|添加成功
     */
    public YsKit save(Catelog catelog) {
        try {
            Date d = new Date();
            catelog.setAddTime(d);
            catelog.setUpdateTime(d);
            boolean isOk = Db.save(TABLE_NAME, catelog.toRecord());
            if (isOk) {
                return YsKit.ok().msg("保存成功").code("101");
            } else {
                return YsKit.fail().msg("保存失败").code("400");
            }
        } catch (Exception e) {
            LogKit.error("CatelogDao.save():" + e.getLocalizedMessage());
            return YsKit.sqlError().code("410");
        }
    }

    /**
     * 根据id删除分类
     * 
     * @param id
     *            分类的id
     * @return true|删除成功
     */
    public YsKit delete(long id) {
        try {
            boolean isOk = Db.deleteById(TABLE_NAME, id);
            if (isOk) {
                return YsKit.ok().msg("删除成功").code("101");
            } else {
                return YsKit.fail().msg("删除失败").code("400");
            }
        } catch (Exception e) {
            LogKit.error("CatelogDao.delete():" + e.getLocalizedMessage());
            return YsKit.sqlError().code("410");
        }
    }

    /**
     * 修改分类信息
     * 
     * @param id
     *            分类id
     * @param name
     *            分类名称
     * @param desc
     *            分类说明
     * @return
     */
    public YsKit update(long id, String name, String desc) {
        return this.updateColumnsById(id,
                Kv.by("name", name).set("description", desc).set("update_time", YsDateUtils.getStr()));
    }

    /**
     * 更新分类信息
     * 
     * @param cid
     *            分类id
     * @param data
     *            待修改的内容
     * @return
     */
    private YsKit updateColumnsById(long cid, Kv data) {
        try {
            SqlPara sqlPara = Db.getSqlPara("catelog.updateColumnsById", Kv.by("data", data).set("id", cid));
            int num = Db.update(sqlPara);
            if (num > 0) {
                return YsKit.ok().msg("更新成功").code("101");
            } else {
                return YsKit.fail().msg("更新失败").code("400");
            }
        } catch (Exception e) {
            LogKit.error("CatelogDao.updateColumnsById():" + e.getLocalizedMessage());
            return YsKit.sqlError().code("410");
        }
    }

    /**
     * 根据id查询分类的信息
     * 
     * @param id
     * @return
     */
    public Catelog get(long id) {
        return Catelog.dao.findById(id);
    }

    /**
     * 查询分类的数量
     * 
     * @return
     */
    public long count() {
        return Db.queryLong(Db.getSql("catelog.count"));
    }

    /**
     * 多条件进行查找
     * 
     * @param pageNumber
     * @param pageSize
     * @param select
     *            为null则查询所有， 查询的参数，字段=别名，别名可以为null
     * @param cond
     *            为空则表示无条件， 条件，条件=值,多条件之间只有and连接
     * @return data:Page<Record>
     */
    public Page<Record> pageByCond(int pageNumber, int pageSize, Kv cond) {
        try {
            SqlPara sqlPara = Db.getSqlPara("catelog.page", Kv.by("cond", cond));
            return Db.paginate(pageNumber, pageSize, sqlPara);
        } catch (Exception e) {
            LogKit.error("CatelogDao.pageByCond():" + e.getLocalizedMessage());
            return new Page<Record>();
        }
    }

    /**
     * 查询某个日期之后的分类的数量
     * 
     * @param beginDate
     *            指定的日期
     * @return
     */
    public long count(Date beginDate) {
        return Db.queryLong("SELECT COUNT(1) FROM ys_catelog WHERE update_time > ?", YsDateUtils.toStr(beginDate));
    }

}
